package com.sun.jdk.lambda;

public class Demo01Lambda {

    /**
     * 需求1：创建一个线程并指定线程要执行的任务
     *
     * @param args
     */
    public static void main(String[] args) {

        System.out.println("主线程中代码执行：" + Thread.currentThread().getName());

        /**
         * 1. 最原始的方法，创建Thread类时传递一个Runnable接口的实现类
         */
        Thread t1 = new Thread(new MyRunnable());
        t1.start();

        /**
         * 2. 使用匿名内部类，即在创建Thread对象时，为其传递一个Runnable接口的匿名内部类
         *
         *    分析：这样可以省去定义一个Runnable接口的实现类
         */

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("新线程中代码执行:" + Thread.currentThread().getName());
            }
        });
        t2.start();


        /**
         * 3. 使用Lambda表达式的写法
         *
         *  分析：
         *  a. Thread类需要一个Runnable接口作为参数，Runnable接口中的抽象方法run是用来指定线程任务内容的核心;
         *  b. 为了指定run方法体，不得不需要Runnable接口的实现类（上面第一种方法）；
         *  c. 为了省去定义一个Runnable的实现类，不得不使用匿名内部类(上面第二种方法)；
         *  d. 必须覆盖Runnable接口的抽象方法run,且需要把方法名称、方法参数、方法返回值都要重写一遍，很麻烦；
         *  e. 而实际上，我们只在乎方法体中的代码。
         */
        Thread t3 = new Thread(() -> {
            System.out.println("新线程Lambda表达式：" + Thread.currentThread().getName());
        });
        //Thread t3 = new Thread(() -> System.out.println("新线程Lambda表达式：" + Thread.currentThread().getName()));
        t3.start();

        
        Runnable runnable = () -> System.out.println("新线程Lambda表达式xxx：" + Thread.currentThread().getName());
        Thread t4 = new Thread(runnable);
        t4.start();
    }
}
